package com.windyoffice.droolsdemo.config;

import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.io.ResourceFactory;
import org.kie.spring.KModuleBeanFactoryPostProcessor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
public class DroolsConfig {

    //指定规则文件存放的路径
    private static final  String RULES_PATH="rules/";

    private final KieServices kieServices=KieServices.Factory.get();


    @Bean
    @ConditionalOnMissingBean
    public KieFileSystem kieFileSystem() throws Exception{
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        Resource[] files = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "*.drl");
        String path=null;
        for (Resource file : files) {
            path=RULES_PATH+file.getFilename();
            kieFileSystem.write(ResourceFactory.newClassPathResource(path,"utf-8"));
        }
        return kieFileSystem;
    }


    @Bean
    @ConditionalOnMissingBean
    public KieContainer kieContainer() throws Exception{
        KieRepository kieRepository = kieServices.getRepository();
        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());
        kieBuilder.buildAll();
        return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
    }

    @Bean
    @ConditionalOnMissingBean
    public KieBase kieBase() throws Exception{
        return kieContainer().getKieBase();
    }

    @Bean
    @ConditionalOnMissingBean
    public KModuleBeanFactoryPostProcessor kiePostProcessor(){
        return new KModuleBeanFactoryPostProcessor();
    }

}
